package top.yinjinbiao.demo.netty.custom.arom;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.ReferenceCountUtil;

/**
 * @Description
 * @Author yin.jinbiao
 * @Date 2021/10/8 13:31
 * @Version 1.0
 */
public class ClientHandler extends ChannelInboundHandlerAdapter {

    // 客户端与服务端，连接成功的售后
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        // 发送SmartCar协议的消息
        // 要发送的信息
        byte host = 0x00;//主机
        byte command = 0x12;//命令代码
        byte moduleAddr = -128;//模块地址 1000 0000 1
        byte channel = -128;//通道号
        byte func = 0x00;//功能号
        byte area = 0x00;//区域号
        byte scene = 0x00;//场景号

        // 获得要发送信息的字节数组
        byte[] param = {moduleAddr,channel,func,area,scene};
        // 要发送信息的长度
        byte contentLength = (byte) (3+param.length+1);

        byte paramCrc = 0;

        for (int i = 0; i < param.length; i++) {
            paramCrc ^= param[i];
        }

        byte crc = (byte) (AROMConstant.HEAD_DATA_2^contentLength^host^command^paramCrc);

        AROMDataPackage protocol = new AROMDataPackage(contentLength, host,command,param,crc);

        ctx.writeAndFlush(protocol);
    }

    // 只是读数据，没有写数据的话
    // 需要自己手动的释放的消息
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg)
            throws Exception {
        try {
            // 用于获取客户端发来的数据信息
            AROMDataPackage body = (AROMDataPackage) msg;
            System.out.println("Client接受的客户端的信息 :" + body.toString());

        } finally {
            ReferenceCountUtil.release(msg);
        }
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
            throws Exception {
        ctx.close();
    }

}
